package twitter.client;

import org.apache.commons.lang3.StringUtils;

import twitter.client.util.Consts;
import twitter.client.util.Global;
import twitter.client.util.Utils;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class AddAccountActivity extends Activity {
	private WebView webView;
	private ProgressDialog progress;
	private Twitter twitter;
	private RequestToken requestToken;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.account_add);

		twitter = new TwitterFactory().getInstance();
		requestToken = null;
		try {
			requestToken = twitter.getOAuthRequestToken();
		} catch (TwitterException e) {
			Log.e("Exception", "", e);
		}

		webView = (WebView) findViewById(R.id.accountAddWebView);
		webView.setWebViewClient(new CustomWebViewClient());
		webView.getSettings().setJavaScriptEnabled(true);
		webView.loadUrl(requestToken.getAuthenticationURL());
		webView.setWebChromeClient(new CustomWebChromeClient());

	}

	private class CustomWebViewClient extends WebViewClient {

		public CustomWebViewClient() {
		}

		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			// 格好をつけるためにスピナー型プログレスダイアログを表示
			if (progress == null) {
				progress = new ProgressDialog(view.getContext());
				progress.setMessage("通信中");
				progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			}
			progress.show();
		}

		@Override
		public void onPageFinished(WebView view, String url) {
			progress.hide();

			// HTMLソース上のpinコードを取得するためのJavaScript
			String script = "javascript:var elem = document.getElementsByTagName('code')[0]; if(elem) alert(elem.childNodes[0].nodeValue);";
			view.loadUrl(script);
		}

	}

	// JavaScript：alertをAndroid側でハンドリングするための仕組みである
	// WebChromeClient#onJsAlert()メソッドをオーバーライドして
	private class CustomWebChromeClient extends WebChromeClient {

		@Override
		public boolean onJsAlert(WebView view, String url, String message,
				JsResult result) {
			// とりあえずAlertDialogでPINコードを表示し、ボタン押下によりアプリ終了
			if (StringUtils.isNotEmpty(message)) {
				AccessToken accessToken = null;
				User user = null;
				try {
					accessToken = twitter.getOAuthAccessToken(requestToken,
							message);
					user = twitter.showUser(twitter.getId());
				} catch (TwitterException e) {
					Log.e("AddAccountActivity", "TwitterException", e);
				}

				if (accessToken != null && user != null) {
					ContentValues values = new ContentValues();
					values.put("id", user.getId());
					values.put("name", user.getName());
					values.put("screen_name", user.getScreenName());
					values.put("profile_image_url", user.getProfileImageURL()
							.toString());
					values.put("access_token", accessToken.getToken());
					values.put("access_token_secret",
							accessToken.getTokenSecret());
					Global.db.insert(Consts.DB_TABLE_ACCOUNT, "", values);
				} else {
					Utils.showToast(getCurrentFocus().getContext(), "認証に失敗しました");
				}

				progress.dismiss();

				Activity activity = (Activity) getCurrentFocus().getContext();
				activity.finish();
			}

			result.confirm();

			// アラートダイアログをこのメソッド内で処理したか
			// falseを返すとAndroid APIによるデフォルトのアラートダイアログが表示されるため、今回はtrueを返す
			return true;
		}
	}
}